/**
 * 作用：在webpack打包输出前将上次打包内容清空
 * 开发思路：
 * 1、如何在打包输出前执行？需要使用compiler.hooks.emit钩子，它是打包输出前触发。
 * 2、如何清空上次打包内容？
 *    获取打包输出目录：通过compiler对象；
 *    通过文件操作清空内容：通过compiler.outputFileSystem操作文件
 */
class CleanWebpackPlugin {
  constructor(options = {}) {
    this.$options = options
  }

  apply(compiler) {
    // 获取打包输出的目录
    const outputPath = compiler.options.output.path
    const fs = compiler.outputFileSystem
    // 打包输出前调用emit钩子
    compiler.hooks.emit.tap('CleanWebpackPlugin', (compilation) => {
      // 通过fs删除打包输出目录下的所有文件
      this.removeFiles(fs, outputPath)
    })
  }

  /**
   * 删除文件：要确定文件夹下的文件全部删除，才能删除文件夹
   * @param fs
   * @param filePath
   */
  removeFiles(fs, filePath) {
    // 获取当前目录下的所有文件
    const files = fs.readdirSync(filePath)
    files.forEach(file => {
      const path = `${filePath}/${file}`
      // 判断是文件还是文件夹
      if (file.statSync(path).isDirectory()) {
        this.removeFiles(fs, path)
      } else {
        fs.unlinkSync(path)
      }
    })
  }
}

module.exports = CleanWebpackPlugin
